home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 21 / Cream of the Crop 21 (Terry Blount) (October 1996).iso / os2 / e33el2.zip / emacs / 19.33 / lisp / pascal.el < prev    next >
Lisp/Scheme  |  1996-05-23  |  57KB  |  1,559 lines

  1. ;;; pascal.el --- major mode for editing pascal source in Emacs
  2.  
  3. ;; Copyright (C) 1993, 1994, 1995 Free Software Foundation, Inc.
  4.  
  5. ;; Author: Espen Skoglund (espensk@stud.cs.uit.no)
  6. ;; Keywords: languages
  7.  
  8. ;; This file is part of GNU Emacs.
  9.  
  10. ;; GNU Emacs is free software; you can redistribute it and/or modify
  11. ;; it under the terms of the GNU General Public License as published by
  12. ;; the Free Software Foundation; either version 2, or (at your option)
  13. ;; any later version.
  14.  
  15. ;; GNU Emacs is distributed in the hope that it will be useful,
  16. ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18. ;; GNU General Public License for more details.
  19.  
  20. ;; You should have received a copy of the GNU General Public License
  21. ;; along with GNU Emacs; see the file COPYING.  If not, write to
  22. ;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  23. ;; Boston, MA 02111-1307, USA.
  24.  
  25. ;;; Commentary:
  26.  
  27. ;; USAGE
  28. ;; =====
  29.  
  30. ;; Emacs should enter Pascal mode when you find a Pascal source file.
  31. ;; When you have entered Pascal mode, you may get more info by pressing
  32. ;; C-h m. You may also get online help describing various functions by:
  33. ;; C-h f <Name of function you want described>
  34.  
  35. ;; If you want to customize Pascal mode to fit you better, you may add
  36. ;; these lines (the values of the variables presented here are the defaults):
  37. ;;
  38. ;; ;; User customization for Pascal mode
  39. ;; (setq pascal-indent-level       3
  40. ;;       pascal-case-indent        2
  41. ;;       pascal-auto-newline       nil
  42. ;;       pascal-tab-always-indent  t
  43. ;;       pascal-auto-endcomments   t
  44. ;;       pascal-auto-lineup        '(all)
  45. ;;       pascal-toggle-completions nil
  46. ;;       pascal-type-keywords      '("array" "file" "packed" "char" 
  47. ;;                       "integer" "real" "string" "record")
  48. ;;       pascal-start-keywords     '("begin" "end" "function" "procedure"
  49. ;;                       "repeat" "until" "while" "read" "readln"
  50. ;;                       "reset" "rewrite" "write" "writeln")
  51. ;;       pascal-separator-keywords '("downto" "else" "mod" "div" "then"))
  52.  
  53. ;; KNOWN BUGS / BUGREPORTS
  54. ;; =======================
  55. ;; As far as I know, there are no bugs in the current version of this
  56. ;; package.  This may not be true however, since I never use this mode
  57. ;; myself and therefore would never notice them anyway.   If you do
  58. ;; find any bugs, you may submit them to: espensk@stud.cs.uit.no
  59. ;; as well as to bug-gnu-emacs@prep.ai.mit.edu.
  60.  
  61. ;;; Code:
  62.  
  63. (defvar pascal-mode-abbrev-table nil
  64.   "Abbrev table in use in Pascal-mode buffers.")
  65. (define-abbrev-table 'pascal-mode-abbrev-table ())
  66.  
  67. (defvar pascal-mode-map ()
  68.   "Keymap used in Pascal mode.")
  69. (if pascal-mode-map
  70.     ()
  71.   (setq pascal-mode-map (make-sparse-keymap))
  72.   (define-key pascal-mode-map ";"        'electric-pascal-semi-or-dot)
  73.   (define-key pascal-mode-map "."        'electric-pascal-semi-or-dot)
  74.   (define-key pascal-mode-map ":"        'electric-pascal-colon)
  75.   (define-key pascal-mode-map "="        'electric-pascal-equal)
  76.   (define-key pascal-mode-map "#"        'electric-pascal-hash)
  77.   (define-key pascal-mode-map "\r"       'electric-pascal-terminate-line)
  78.   (define-key pascal-mode-map "\t"       'electric-pascal-tab)
  79.   (define-key pascal-mode-map "\M-\t"    'pascal-complete-word)
  80.   (define-key pascal-mode-map "\M-?"     'pascal-show-completions)
  81.   (define-key pascal-mode-map "\177"     'backward-delete-char-untabify)
  82.   (define-key pascal-mode-map "\M-\C-h"  'pascal-mark-defun)
  83.   (define-key pascal-mode-map "\C-c\C-b" 'pascal-insert-block)
  84.   (define-key pascal-mode-map "\M-*"     'pascal-star-comment)
  85.   (define-key pascal-mode-map "\C-c\C-c" 'pascal-comment-area)
  86.   (define-key pascal-mode-map "\C-c\C-u" 'pascal-uncomment-area)
  87.   (define-key pascal-mode-map "\M-\C-a"  'pascal-beg-of-defun)
  88.   (define-key pascal-mode-map "\M-\C-e"  'pascal-end-of-defun)
  89.   (define-key pascal-mode-map "\C-c\C-d" 'pascal-goto-defun)
  90.   (define-key pascal-mode-map "\C-c\C-o" 'pascal-outline)
  91. ;;; A command to change the whole buffer won't be used terribly
  92. ;;; often, so no need for a key binding.
  93. ;  (define-key pascal-mode-map "\C-cd"    'pascal-downcase-keywords)
  94. ;  (define-key pascal-mode-map "\C-cu"    'pascal-upcase-keywords)
  95. ;  (define-key pascal-mode-map "\C-cc"    'pascal-capitalize-keywords)
  96.   )
  97.  
  98. (defvar pascal-imenu-generic-expression
  99.   '("^[ \t]*\\(function\\|procedure\\)[ \t\n]+\\([a-zA-Z0-9_.:]+\\)" . (2))
  100.   "Imenu expression for Pascal-mode.  See `imenu-generic-expression'.")
  101.   
  102. (defvar pascal-keywords
  103.   '("and" "array" "begin" "case" "const" "div" "do" "downto" "else" "end" 
  104.     "file" "for" "function" "goto" "if" "in" "label" "mod" "nil" "not" "of" 
  105.     "or" "packed" "procedure" "program" "record" "repeat" "set" "then" "to" 
  106.     "type" "until" "var" "while" "with"
  107.     ;; The following are not standard in pascal, but widely used.
  108.     "get" "put" "input" "output" "read" "readln" "reset" "rewrite" "write"
  109.     "writeln"))
  110.  
  111. ;;;
  112. ;;; Regular expressions used to calculate indent, etc.
  113. ;;;
  114. (defconst pascal-symbol-re      "\\<[a-zA-Z_][a-zA-Z_0-9.]*\\>")
  115. (defconst pascal-beg-block-re   "\\<\\(begin\\|case\\|record\\|repeat\\)\\>")
  116. (defconst pascal-end-block-re   "\\<\\(end\\|until\\)\\>")
  117. (defconst pascal-declaration-re "\\<\\(const\\|label\\|type\\|var\\)\\>")
  118. (defconst pascal-defun-re       "\\<\\(function\\|procedure\\|program\\)\\>")
  119. (defconst pascal-sub-block-re   "\\<\\(if\\|else\\|for\\|while\\|with\\)\\>")
  120. (defconst pascal-noindent-re    "\\<\\(begin\\|end\\|until\\|else\\)\\>")
  121. (defconst pascal-nosemi-re      "\\<\\(begin\\|repeat\\|then\\|do\\|else\\)\\>")
  122. (defconst pascal-autoindent-lines-re
  123.   "\\<\\(label\\|var\\|type\\|const\\|until\\|end\\|begin\\|repeat\\|else\\)\\>")
  124.  
  125. ;;; Strings used to mark beginning and end of excluded text
  126. (defconst pascal-exclude-str-start "{-----\\/----- EXCLUDED -----\\/-----")
  127. (defconst pascal-exclude-str-end " -----/\\----- EXCLUDED -----/\\-----}")
  128.  
  129. (defvar pascal-mode-syntax-table nil
  130.   "Syntax table in use in Pascal-mode buffers.")
  131.  
  132. (if pascal-mode-syntax-table
  133.     ()
  134.   (setq pascal-mode-syntax-table (make-syntax-table))
  135.   (modify-syntax-entry ?\\ "."   pascal-mode-syntax-table)
  136.   (modify-syntax-entry ?( "()1"  pascal-mode-syntax-table)  
  137.   (modify-syntax-entry ?) ")(4"  pascal-mode-syntax-table)
  138.   (modify-syntax-entry ?* ". 23" pascal-mode-syntax-table)
  139.   (modify-syntax-entry ?{ "<"    pascal-mode-syntax-table)
  140.   (modify-syntax-entry ?} ">"    pascal-mode-syntax-table)
  141.   (modify-syntax-entry ?+ "."    pascal-mode-syntax-table)
  142.   (modify-syntax-entry ?- "."    pascal-mode-syntax-table)
  143.   (modify-syntax-entry ?= "."    pascal-mode-syntax-table)
  144.   (modify-syntax-entry ?% "."    pascal-mode-syntax-table)
  145.   (modify-syntax-entry ?< "."    pascal-mode-syntax-table)
  146.   (modify-syntax-entry ?> "."    pascal-mode-syntax-table)
  147.   (modify-syntax-entry ?& "."    pascal-mode-syntax-table)
  148.   (modify-syntax-entry ?| "."    pascal-mode-syntax-table)
  149.   (modify-syntax-entry ?_ "w"    pascal-mode-syntax-table)
  150.   (modify-syntax-entry ?\' "\""  pascal-mode-syntax-table))
  151.  
  152. (defvar pascal-font-lock-keywords
  153.   (list
  154.    '("^[ \t]*\\(function\\|pro\\(cedure\\|gram\\)\\)\\>[ \t]*\\(\\sw+\\)?"
  155.      (1 font-lock-keyword-face) (3 font-lock-function-name-face nil t))
  156. ;   ("type" "const" "real" "integer" "char" "boolean" "var"
  157. ;    "record" "array" "file")
  158.    (cons (concat "\\<\\(array\\|boolean\\|c\\(har\\|onst\\)\\|file\\|"
  159.          "integer\\|re\\(al\\|cord\\)\\|type\\|var\\)\\>")
  160.      'font-lock-type-face)
  161.    '("\\<\\(label\\|external\\|forward\\)\\>" . font-lock-reference-face)
  162.    '("\\<\\([0-9]+\\)[ \t]*:" 1 font-lock-reference-face)
  163. ;   ("of" "to" "for" "if" "then" "else" "case" "while"
  164. ;    "do" "until" "and" "or" "not" "in" "with" "repeat" "begin" "end")
  165.    (concat "\\<\\("
  166.        "and\\|begin\\|case\\|do\\|e\\(lse\\|nd\\)\\|for\\|i[fn]\\|"
  167.        "not\\|o[fr]\\|repeat\\|t\\(hen\\|o\\)\\|until\\|w\\(hile\\|ith\\)"
  168.        "\\)\\>")
  169.    '("\\<\\(goto\\)\\>[ \t]*\\([0-9]+\\)?"
  170.      (1 font-lock-keyword-face) (2 font-lock-reference-face nil t)))
  171.   "Add